﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using SAP.Middleware.Connector;
using LibSolPedI;

namespace LibSolPedDALC
{
    public class ParametroDALC : IParametroDALC
    {
        private string _connId = string.Empty;

        public static ParametroDALC Instance(string pConnId)
        {
            if (_instance == null)
            {
                lock (typeof(ParametroDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new ParametroDALC(pConnId);
                    }
                }
            }
            return _instance;
        }
        private ParametroDALC(string pConnId) { this._connId = pConnId; }
        private ParametroDALC() { }
        private static volatile ParametroDALC _instance = null;

        #region IParametroDALC Members


        
        public int getDecimales()
        {
            return ParametroDALC.getDecimalesStatic;
        }

        public decimal getIGV()
        {
            throw new NotImplementedException();
        }


        /// <summary>
        /// Busca en el archivo de configuración el valor de un key
        /// </summary>
        /// <param name="key">Nombre de una entrada en el archivo de configuración</param>
        /// <returns>Valor asociado al key</returns>
        public string getParamValue(string key)
        {
            return getParamValueStatic(key);
        }

        public bool esTipoOferta(string pCodTipoDoc)
        {
            return esOferta(pCodTipoDoc);
        }

        /// <summary>
        /// Verifica que tipo de doc sea algun tipo de servicio
        /// </summary>
        /// <param name="pCodTipoDoc">Tipo de documento.</param>
        /// <returns>Devuelve true si es un servicio o false si no es servicio</returns>
        public bool esTipoServicio(string pCodTipoDoc)
        {
            return esPedidoServicio(pCodTipoDoc);
        }

        public bool esTipoPosCombo(string pCodTipoPos)
        {
            return esTipoPosComboStatic(pCodTipoPos);
        }

        public bool esTipoPosKit(string pCodTipoPos)
        {
            throw new NotImplementedException();
        }

        public bool esTipoCabCombo(string pCodTipoPos)
        {
            throw new NotImplementedException();
        }

        public bool esTipoCabKit(string pCodTipoPos)
        {
            return esTipoCabKitStatic(pCodTipoPos);
        }

        public bool esTipoSinLote(string pCodTipoDoc)
        {
            return esTipoSinLoteStatic(pCodTipoDoc);
        }

        public bool esTipoXY(string pCodigo, string pConfigKey)
        {
            return esTipoX(pCodigo, pConfigKey);
        }

        #endregion

        public static DateTime dateSapToNet(string pFechaSAP)
        {
            DateTime tmpVar = new DateTime();
            try
            {
                tmpVar = new DateTime(Convert.ToInt16(pFechaSAP.Substring(0, 4)), Convert.ToInt16(pFechaSAP.Substring(4, 2)), Convert.ToInt16(pFechaSAP.Substring(6, 2)));
            }
            catch { tmpVar = new DateTime(); }
            return tmpVar;
        }

        public static string dateNetToSap(DateTime pFechaNET)
        {
            try
            {
                return pFechaNET.Year.ToString().PadLeft(4, '0') + pFechaNET.Month.ToString().PadLeft(2, '0') + pFechaNET.Day.ToString().PadLeft(2, '0');
            }
            catch { return string.Empty; }
        }

        public static string getParamValueStatic(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }


        /// <summary>
        /// Verifica que sea un tipo determinado.
        /// </summary>
        /// <param name="pCodigo">Valor que se pide verificar.</param>
        /// <param name="pConfigKey">Llave que es buscada en el archivo de configuración.</param>
        /// <returns>Devuelve true o false </returns> 
        public static bool esTipoX(string pCod, string pConfigKey)
        {
            string[] codTipoDoc = getParamValueStatic(pConfigKey).Split(',');
            foreach (string str in codTipoDoc)
            {
                if (pCod == str)
                {
                    return true;
                }
            }
            return false;
        }

        public static bool esOferta(string pCodTipoDoc)
        {
            string[] codServs = getParamValueStatic("CodOferta").Split(',');
            foreach (string str in codServs)
            {
                if (pCodTipoDoc == str)
                {
                    return true;
                }
            }
            return false;
        }

        public static bool esTipoPosComboStatic(string pCodTipoPos)
        {
            string[] codTipoPos = getParamValueStatic("TipoPosCombo").Split(',');
            foreach (string str in codTipoPos)
            {
                if (pCodTipoPos == str)
                {
                    return true;
                }
            }
            return false;
        }

        public static bool esTipoSinLoteStatic(string pCodTipoDoc)
        {
            string[] codTipoDoc = getParamValueStatic("CodSinLote").Split(',');
            foreach (string str in codTipoDoc)
            {
                if (pCodTipoDoc == str)
                {
                    return true;
                }
            }
            return false;
        }

        public static bool esTipoCabKitStatic(string pCodTipoPos)
        {
            string[] codTipoPos = getParamValueStatic("TipoCabKit").Split(',');
            foreach (string str in codTipoPos)
            {
                if (pCodTipoPos == str)
                {
                    return true;
                }
            }
            return false;
        }

        public static int getDecimalesStatic
        {
            get { return Convert.ToInt16(getParamValueStatic("Decimales")); }
        }

        public static bool esPedidoServicio(string pCodTipoDoc)
        {
            string[] codServs = getParamValueStatic("CodServicios").Split(',');
            foreach (string str in codServs)
            {
                if (pCodTipoDoc == str)
                {
                    return true;
                }
            }
            return false;
        }

        public static bool esTipoCabComboStatic(string pCodTipoPos)
        {
            string[] codTipoPos = getParamValueStatic("TipoCabCombo").Split(',');
            foreach (string str in codTipoPos)
            {
                if (pCodTipoPos == str)
                {
                    return true;
                }
            }
            return false;
        }

    }
}
